package com.example.apitesttool.controller;

import com.example.apitesttool.service.SwaggerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * Swagger/OpenAPI 文档上传控制器
 * 
 * 提供 RESTful API 接口用于上传和管理 OpenAPI/Swagger 文档。
 * 支持 JSON 和 YAML 格式的文档上传，并提供初步的格式化和验证功能。
 * 
 * 主要功能：
 * - 文档文件上传
 * - 文档格式验证
 * - 文档信息提取和格式化
 * - 错误处理和用户友好的响应
 * 
 * @author liuxy
 * @version 1.0.0
 */
@RestController
@RequestMapping("/api/swagger")
@CrossOrigin(origins = "*") // 允许跨域请求
public class SwaggerUploadController {
    
    private static final Logger logger = LoggerFactory.getLogger(SwaggerUploadController.class);
    
    private final SwaggerService swaggerService;

    @Autowired
    public SwaggerUploadController(SwaggerService swaggerService) {
        this.swaggerService = swaggerService;
    }

    /**
     * 上传 OpenAPI/Swagger 文档文件
     * 
     * @param file 上传的文件（支持 JSON 和 YAML 格式）
     * @return 包含文档 ID 和格式化输出的响应
     */
    @PostMapping("/upload")
    public ResponseEntity<Map<String, Object>> uploadSwagger(@RequestParam("file") MultipartFile file) {
        logger.info("收到文档上传请求，文件名: {}, 大小: {} bytes", file.getOriginalFilename(), file.getSize());
        
        Map<String, Object> response = new HashMap<>();
        
        try {
            // 验证文件
            if (file.isEmpty()) {
                logger.warn("上传的文件为空");
                response.put("success", false);
                response.put("error", "上传的文件为空，请选择一个有效的 OpenAPI/Swagger 文档文件");
                return ResponseEntity.badRequest().body(response);
            }
            
            // 检查文件大小（限制为 10MB）
            if (file.getSize() > 10 * 1024 * 1024) {
                logger.warn("上传的文件过大: {} bytes", file.getSize());
                response.put("success", false);
                response.put("error", "文件大小超过限制（最大 10MB）");
                return ResponseEntity.badRequest().body(response);
            }
            
            // 检查文件类型
            String originalFilename = file.getOriginalFilename();
            if (originalFilename != null) {
                String lowerFilename = originalFilename.toLowerCase();
                if (!lowerFilename.endsWith(".json") && !lowerFilename.endsWith(".yaml") && 
                    !lowerFilename.endsWith(".yml") && !lowerFilename.endsWith(".txt")) {
                    logger.warn("不支持的文件类型: {}", originalFilename);
                    response.put("success", false);
                    response.put("error", "不支持的文件类型。请上传 .json、.yaml、.yml 或 .txt 格式的文件");
                    return ResponseEntity.badRequest().body(response);
                }
            }
            
            // 读取文件内容
            String content = new String(file.getBytes(), StandardCharsets.UTF_8);
            if (content.trim().isEmpty()) {
                logger.warn("文件内容为空");
                response.put("success", false);
                response.put("error", "文件内容为空，请确保文件包含有效的 OpenAPI/Swagger 定义");
                return ResponseEntity.badRequest().body(response);
            }
            
            logger.debug("文件内容长度: {} 字符", content.length());
            
            // 处理并存储文档
            Map<String, String> result = swaggerService.processAndStoreSwagger(content, originalFilename);
            
            response.put("success", true);
            response.put("documentId", result.get("specId"));
            response.put("formattedOutput", result.get("formattedOutput"));
            response.put("message", "文档上传成功");
            
            logger.info("文档上传处理成功，文档 ID: {}", result.get("specId"));
            return ResponseEntity.ok(response);
            
        } catch (IOException e) {
            logger.error("读取上传文件时发生 IO 错误", e);
            response.put("success", false);
            response.put("error", "读取文件失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
            
        } catch (IllegalArgumentException e) {
            logger.warn("文档格式验证失败: {}", e.getMessage());
            response.put("success", false);
            response.put("error", e.getMessage());
            return ResponseEntity.badRequest().body(response);
            
        } catch (Exception e) {
            logger.error("处理文档上传时发生未知错误", e);
            response.put("success", false);
            response.put("error", "处理文档时发生错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    /**
     * 通过 URL 导入 OpenAPI/Swagger 文档
     * 
     * @param request 包含 URL 的请求体
     * @return 包含文档 ID 和格式化输出的响应
     */
    @PostMapping("/import-url")
    public ResponseEntity<Map<String, Object>> importSwaggerFromUrl(@RequestBody Map<String, String> request) {
        String url = request.get("url");
        logger.info("收到从 URL 导入文档的请求: {}", url);
        
        Map<String, Object> response = new HashMap<>();
        
        try {
            if (url == null || url.trim().isEmpty()) {
                response.put("success", false);
                response.put("error", "URL 不能为空");
                return ResponseEntity.badRequest().body(response);
            }
            
            // 处理并存储从 URL 获取的文档
            Map<String, String> result = swaggerService.processAndStoreSwaggerFromUrl(url.trim());
            
            response.put("success", true);
            response.put("documentId", result.get("specId"));
            response.put("formattedOutput", result.get("formattedOutput"));
            response.put("message", "文档导入成功");
            
            logger.info("从 URL 导入文档成功，文档 ID: {}", result.get("specId"));
            return ResponseEntity.ok(response);
            
        } catch (IllegalArgumentException e) {
            logger.warn("URL 文档格式验证失败: {}", e.getMessage());
            response.put("success", false);
            response.put("error", e.getMessage());
            return ResponseEntity.badRequest().body(response);
            
        } catch (Exception e) {
            logger.error("从 URL 导入文档时发生错误", e);
            response.put("success", false);
            response.put("error", "导入文档时发生错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(response);
        }
    }

    /**
     * 获取上传状态和统计信息
     * 
     * @return 当前系统中的文档统计信息
     */
    @GetMapping("/status")
    public ResponseEntity<Map<String, Object>> getUploadStatus() {
        logger.debug("收到获取上传状态的请求");
        
        try {
            Map<String, Object> status = swaggerService.getSystemStatus();
            return ResponseEntity.ok(status);
            
        } catch (Exception e) {
            logger.error("获取系统状态时发生错误", e);
            Map<String, Object> errorResponse = new HashMap<>();
            errorResponse.put("success", false);
            errorResponse.put("error", "获取系统状态失败: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
        }
    }

    /**
     * 健康检查接口
     * 
     * @return 服务健康状态
     */
    @GetMapping("/health")
    public ResponseEntity<Map<String, Object>> healthCheck() {
        Map<String, Object> health = new HashMap<>();
        health.put("status", "UP");
        health.put("service", "Swagger Upload Service");
        health.put("timestamp", System.currentTimeMillis());
        return ResponseEntity.ok(health);
    }
}

